package snowflakeid.v3;

import com.github.yitter.contract.IdGeneratorOptions;
import com.github.yitter.idgen.YitIdHelper;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * https://github.com/yitter/IdGenerator
 *
 * @author licong
 * @date 2022-12-21 22:07
 */
public class SnowFlake {

    public void init() {
        // 创建 IdGeneratorOptions 对象，可在构造函数中输入 WorkerId：
        IdGeneratorOptions options = new IdGeneratorOptions((short) 1);
        // options.WorkerIdBitLength = 10; // 默认值6，限定 WorkerId 最大值为2^6-1，即默认最多支持64个节点。
        // options.SeqBitLength = 6; // 默认值6，限制每毫秒生成的ID个数。若生成速度超过5万个/秒，建议加大 SeqBitLength 到 10。
        // options.BaseTime = Your_Base_Time; // 如果要兼容老系统的雪花算法，此处应设置为老系统的BaseTime。
        // ...... 其它参数参考 IdGeneratorOptions 定义。

        // 保存参数（务必调用，否则参数设置不生效）：
        YitIdHelper.setIdGenerator(options);

        // 以上过程只需全局一次，且应在生成ID之前完成。
    }

    public static long generateWorkerId() {
        try {
            int randomNum=0;
            String ipLong="";
            String ipStr = InetAddress.getLocalHost().getHostAddress();
            ipLong = String.valueOf(getIpConvertNum(ipStr));
            //从1到9的int型随数
            randomNum = (int)(1+Math.random()*(9-1+1));
            return new Long(ipLong.substring(ipLong.length() - 2) + randomNum);
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return 1;
        }
    }

    /**
     * 将ip 地址转换成数字
     *
     * @param ipAddress
     *            传入的ip地址
     * @return 转换成数字类型的ip地址
     */
    public static long getIpConvertNum(String ipAddress) {
        String[] ip = ipAddress.split("\\.");
        long a = Integer.parseInt(ip[0]);
        long b = Integer.parseInt(ip[1]);
        long c = Integer.parseInt(ip[2]);
        long d = Integer.parseInt(ip[3]);

        long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
        return ipNum;
    }


    public static void main(String[] args) {
        System.out.println(generateWorkerId());
        System.out.println(generateWorkerId());
        System.out.println(generateWorkerId());
        System.out.println(generateWorkerId());


    }

}
